package com.tosee.dao.hibernate;

import java.io.Serializable;
import java.util.List;

import com.tosee.exception.AccesConcurrentException;
import com.tosee.exception.ViolationContrainteException;

/**
 * DAO générique gérant des entités persistées.
 * 
 * @author FabienC
 * @param <T> Classe de l'entité gérée par ce DAO
 * @param <K> Type de la clé de l'entité
 */
public interface IHibernateGenericDao<T, K extends Serializable> {

    /**
     * Recherche d'une entité par sa clé primaire.
     * 
     * @param id clé de l'entité
     * @return entité trouvée ou <code>null</code> si aucune entité trouvée
     */
    T findById(K id);

    /**
     * Persistance de l'entité passée en paramètre.
     * 
     * @param entity l'entité à enregistrer
     * @throws ViolationContrainteException en cas de violation de contrainte
     */
    void save(T entity) throws ViolationContrainteException;

    /**
     * Mise à jour de l'entité passée en paramètre.
     * 
     * @param entity l'entité à mettre à jour
     * @throws ViolationContrainteException en cas de violation de contrainte
     * @throws AccesConcurrentException en cas d'accès concurrent à une entité
     */
    void update(T entity) throws ViolationContrainteException, AccesConcurrentException;

    /**
     * Suppression de l'entité passée en paramètre.
     * 
     * @param entity l'entité à supprimer
     * @throws ViolationContrainteException en cas de violation de contrainte
     * @throws AccesConcurrentException en cas d'accès concurrent à une entité
     */
    void delete(T entity) throws ViolationContrainteException, AccesConcurrentException;

    /**
     * Récupération de toutes les entités.
     * 
     * @return liste de toutes les entités
     */
    List<T> findAll();

}
